LED strip music visualization using Python and the ESP8266 module.
Demo
Overview
The guide includes everything needed to build an LED strip music visualizer (excluding hardware):
- Python visualization code, which includes code for:
- Recording audio with a microphone (microphone.py)
- Digital signal processing (dsp.py)
- Constructing 1D visualizations (visualization.py)
- Sending pixel information to the ESP8266 over WiFi (led.py)
- Configuration and settings (config.py)
- Arduino firmware for the ESP8266 (ws2812_controller_esp8266.ino)
Computer + ESP8266
To build a visualizer using a computer and ESP8266, you will need: - Computer with Python 2.7 or 3.5 (Anaconda is recommended on Windows) - ESP8266 module with RX1 pin exposed. These modules can be purchased for as little as $5 USD. These modules are known to be compatible, but many others will work too: - NodeMCU v3 - Adafruit HUZZAH - Adafruit Feather HUZZAH - WS2812B LED strip (such as Adafruit Neopixels). These can be purchased for as little as $5-15 USD per meter. - 5V power supply - 3.3V-5V level shifter (optional, must be non-inverting)
Limitations when using a computer + ESP8266: - The communication protocol between the computer and ESP8266 currently supports a maximum of 256 LEDs.
Installation for Computer + ESP8266
Python Dependencies
Visualization code is compatible with Python 2.7 or 3.5. A few Python dependencies must also be installed: - Numpy - Scipy (for digital signal processing) - PyQtGraph (for GUI visualization) - PyAudio (for recording audio with microphone)
On Windows machines, the use of Anaconda is highly recommended. Anaconda simplifies the installation of Python dependencies, which is sometimes difficult on Windows.
Installing python dependencies
The pip package manager can also be used to install the python dependencies.
pip install numpy
pip install scipy
pip install pyqtgraph
pip install pipwin
pipwin install pyaudio
If pip
is not found try using python -m pip install
instead.
Running the visualization can be done using the command below.
python3 visualization.py /tmp
Arduino dependencies
ESP8266 firmare is uploaded using the Arduino IDE. See this tutorial to setup the Arduino IDE for ESP8266.
Install NeoPixelBus library
Download Here or using library manager, search for "NeoPixelBus".
Hardware Connections
ESP8266
The ESP8266 has hardware support for I²S and this peripheral is used to control the ws2812b LED strip. This significantly improves performance compared to bit-banging the IO pin. Unfortunately, this means that the LED strip must be connected to the RX1 pin, which is not accessible in some ESP8266 modules (such as the ESP-01).
The RX1 pin on the ESP8266 module should be connected to the data input pin of the ws2812b LED strip (often labelled DIN or D0).
For the NodeMCU v3 , the location of the RX1 pin is shown in the images below. Many other modules also expose the RX1 pin.
Setup and Configuration
- Install Python and Python dependencies
- Install Arduino IDE and ESP8266 addon
- Download and extract all of the files in this repository onto your computer
- Connect the RX1 pin of your ESP8266 module to the data input pin of the ws2812b LED strip. Ensure that your LED strip is properly connected to a 5V power supply and that the ESP8266 and LED strip share a common electrical ground connection.
- In ws2812_controller.ino:
- Set
const char* ssid
to your router's SSID - Set
const char* password
to your router's password - Set
IPAddress gateway
to match your router's gateway - Set
IPAddress ip
to the IP address that you would like your ESP8266 to use (your choice) - Set
#define NUM_LEDS
to the number of LEDs in your LED strip
- Upload the ws2812_controller.ino
firmware to the ESP8266. Ensure that you have selected the correct ESP8266 board from the boards menu.
In the dropdown menu, set
CPU Frequency
to 160 MHz for optimal performance. - In config.py:
- Set
N_PIXELS
to the number of LEDs in your LED strip (must matchNUM_LEDS
in ws2812_controller.ino) - Set
UDP_IP
to the IP address of your ESP8266 (must matchip
in ws2812_controller.ino) - If needed, set
MIC_RATE
to your microphone sampling rate in Hz. Most of the time you will not need to change this.